C++ STACK
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1 为什么需要栈
1.1 现实抽象
* 浏览器后退
* 函数调用
* 表达式求值
* 撤销操作(Undo)
1.2 抽象模型
栈是受限线性表:
Stack={a1,a2,…,an},top=an\text{Stack}=\{a_1,a_2,\dots,a_n\},\quad top=a_n Stack={a1 ,a2 ,…,an },top=an
只允许在一端操作。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
2 STL STACK 本质
2.1 容器适配器(ADAPTER)
✅ 不自己存数据
✅ 复用底层容器接口
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
2.2 默认底层
底层容器 是否允许 deque ✅ 默认 vector ✅ list ✅ array ❌
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
3 定义方式
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
4 核心操作
语义 函数 复杂度 入栈 push(x) O(1)O(1)O(1) 出栈 pop() O(1)O(1)O(1) 取顶 top() O(1)O(1)O(1) 判空 empty() O(1)O(1)O(1) 大小 size() O(1)O(1)O(1)
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
5 基础示例
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
6 栈的数学性质
6.1 出栈序列数(卡特兰数)
入栈序列:
1,2,…,n1,2,\dots,n 1,2,…,n
合法出栈序列数为:
Cn=1n+1(2nn)C_n=\frac{1}{n+1}\binom{2n}{n} Cn =n+11 (n2n )
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
6.2 递归与栈等价性
任意递归:
f(n)={1,n=0n⋅f(n−1),n>0f(n)= \begin{cases} 1,&n=0\\ n\cdot f(n-1),&n>0 \end{cases} f(n)={1,n⋅f(n−1), n=0n>0
等价于显式栈模拟。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
7 经典算法应用
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
7.1 括号匹配
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
7.2 单调栈(MONOTONIC STACK)
问题抽象
对每个元素,找:
Next Greater Element\text{Next Greater Element} Next Greater Element
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
算法思想
维护单调递减栈:
s1>s2>⋯>sks_1 > s_2 > \dots > s_k s1 >s2 >⋯>sk
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
模板代码
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
7.3 表达式求值(后缀)
中缀转后缀
优先级:
×,÷>+,−\times,\div > +,- ×,÷>+,−
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
计算核心
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
8 手写栈(理解 STL 本质)
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
9 性能与工程注意
9.1 复杂度总结
操作 平均 最坏 push/pop O(1) O(1)
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
9.2 常见坑
* top() 前未判空
* pop() 不返回值
* 递归过深 → 栈溢出
* vector 底层可能扩容
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
10 进阶方向
* ✅ 双栈队列
* ✅ 最小栈(Min Stack)
* ✅ 栈帧 & 调用约定
* ✅ 编译器语法分析
* ✅ JVM / OS 调用栈
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
求赞